/*
桥接模式（Bridge Pattern）是一种结构型设计模式，它将抽象部分与实现部分分离，使它们可以独立地变化。
桥接模式通过将继承关系改为关联关系，从而实现了抽象与实现的解耦。

在桥接模式中，有以下几个角色：

● 抽象化（Abstraction）：定义了抽象部分的接口，并维护一个指向实现部分的引用。
● 扩展抽象化（Refined Abstraction）：对抽象部分进行扩展，可以有多个不同的扩展。
● 实现化（Implementor）：定义了实现部分的接口。
● 具体实现化（Concrete Implementor）：实现实现化接口的具体类。

桥接模式通过将抽象部分和实现部分分离，可以使它们可以独立地变化，从而增加了系统的灵活性和可扩展性。

下面是一个使用桥接模式的C语言例程，用于实现一个图形绘制系统，其中抽象部分是图形的形状，实现部分是图形的颜色：
*/

#include <stdio.h>
#include <stdlib.h>

// 实现化接口
typedef struct
{
    void (*drawColor)();
} Color;

// 具体实现化类
typedef struct
{
    Color color;
    void (*drawColor)();
} RedColor;

typedef struct
{
    Color color;
    void (*drawColor)();
} BlueColor;

// 抽象化接口
typedef struct
{
    Color *color;
    void (*drawShape)();
} Shape;

// 扩展抽象化类
typedef struct
{
    Shape shape;
    void (*drawShape)();
} CircleShape;

typedef struct
{
    Shape shape;
    void (*drawShape)();
} SquareShape;

// 实现化接口的实现方法
void drawRedColor()
{
    printf("Drawing in Red Color\n");
}

void drawBlueColor()
{
    printf("Drawing in Blue Color\n");
}

// 抽象化接口的实现方法
void drawCircleShape()
{
    printf("Drawing Circle Shape\n");
    Shape *shape = (Shape *)malloc(sizeof(Shape));
    shape->color = (Color *)malloc(sizeof(Color));
    shape->color->drawColor = drawRedColor;
    shape->color->drawColor();
}

void drawSquareShape()
{
    printf("Drawing Square Shape\n");
    Shape *shape = (Shape *)malloc(sizeof(Shape));
    shape->color = (Color *)malloc(sizeof(Color));
    shape->color->drawColor = drawBlueColor;
    shape->color->drawColor();
}

int main()
{
    // 创建具体实现化对象
    RedColor redColor;
    redColor.color.drawColor = drawRedColor;

    BlueColor blueColor;
    blueColor.color.drawColor = drawBlueColor;

    // 创建扩展抽象化对象
    CircleShape circleShape;
    circleShape.shape.drawShape = drawCircleShape;
    circleShape.shape.color = &(redColor.color);

    SquareShape squareShape;
    squareShape.shape.drawShape = drawSquareShape;
    squareShape.shape.color = &(blueColor.color);

    // 使用扩展抽象化对象绘制图形
    circleShape.shape.drawShape();
    squareShape.shape.drawShape();

    return 0;
}

/*
在上面的例程中，首先定义了实现化接口Color，其中声明了绘制颜色的接口方法。
然后，实现了具体实现化类RedColor和BlueColor，其中实现了绘制颜色的方法。
接下来，定义了抽象化接口Shape，其中声明了绘制形状的接口方法，并维护了一个指向实现化接口的引用。
然后，实现了扩展抽象化类CircleShape和SquareShape，其中实现了绘制形状的方法，并设置了颜色的引用。
在main函数中，创建了具体实现化对象和扩展抽象化对象，并使用扩展抽象化对象来绘制图形。

通过使用桥接模式，我们可以将抽象部分和实现部分分离，使它们可以独立地变化。
这样可以增加系统的灵活性和可扩展性，同时也使得系统的结构更清晰。
*/